package com.yisa.person.utils;

import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.yisa.person.mongo.BatchUpdateOptions;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
public class BathUpdateUtil {

    /**
     * 批量更新
     * @param ordered 如果为true,一条语句更新失败，剩下的语句将不再执。如果为false,一条语句更新失败，剩下的将继续执行。默认为true。
     * @return
     */
    public static int batchUpdate(MongoTemplate mongoTemplate, String collectionName, List<BatchUpdateOptions> options, boolean ordered) {
        return doBatchUpdate(mongoTemplate, collectionName, options, ordered);
    }

    private static int doBatchUpdate(MongoTemplate mongoTemplate, String collName, List<BatchUpdateOptions> options, boolean ordered) {
        DBObject command = new BasicDBObject();
        command.put("update", collName);
        List<BasicDBObject> updateList = new ArrayList<BasicDBObject>();
        for (BatchUpdateOptions option : options) {
            BasicDBObject update = new BasicDBObject();
            update.put("q", option.getQuery().getQueryObject());
            update.put("u", option.getUpdate().getUpdateObject());
            update.put("upsert", option.isUpsert());
            update.put("multi", option.isMulti());
            updateList.add(update);
        }
        command.put("updates", updateList);
        command.put("ordered", ordered);
        Document document = mongoTemplate.getDb().runCommand((Bson) command);


        // n为符合Query查询的记录总数 因为是根据id进行的查询, 原则上只要符合查询的记录数等于要更新的数量就代表成功
        Object n = document.get("n");

        if(n.getClass()==Integer.class){
            return (Integer)n;
        }
        return Integer.parseInt(String.valueOf(n));
    }
}